package com.music.glide.load

import java.security.MessageDigest

/**
 * 定义各种组件（例如解码器、编码器、模型加载器等）的选项
 * 这些选项可以包含可选的默认值，并且能够影响资源磁盘缓存键（DiskCacheStrategy.RESOURCE 使用的缓存键）。
 * 每个选项可以通过实现 update(Object, MessageDigest) 方法自定义其对磁盘缓存键的影响。
 * 这样可以确保缓存键包含特定选项的设置，从而对缓存行为产生影响。
 *
 */
class KOption<T>(
    private val key: String,
    private val defaultValue: T? = null,
    private val cacheKeyUpdater: CacheKeyUpdater<T> = EMPTY_UPDATER as CacheKeyUpdater<T>
) {


    @Volatile
    private var keyBytes: ByteArray? = null

    fun getDefaultValue(): T? = defaultValue

    fun update(defaultValue: T,messageDigest: MessageDigest){
        cacheKeyUpdater.update(getKeyBytes(), defaultValue, messageDigest)
    }

    private fun getKeyBytes():ByteArray {
        if (keyBytes == null) {
            keyBytes = key.toByteArray(KKey.CHARSET)
        }
        return keyBytes!!
    }



    companion object{
         val EMPTY_UPDATER  = object :CacheKeyUpdater<Any>{
            override fun update(keyBytes: ByteArray, value: Any, messageDigest: MessageDigest) {
            }
        }

        /**
         * 返回一个不会影响磁盘缓存键的新 Option，默认值为 null。
         */
        fun <T> memory(key: String): KOption<T> {
            return KOption(key)
        }

        fun <T> memory(key: String,defaultValue:T): KOption<T> {
            return KOption(key, defaultValue)
        }

        fun <T> memory(key: String, cacheKeyUpdater: CacheKeyUpdater<T>): KOption<T> {
            return KOption(key, cacheKeyUpdater = cacheKeyUpdater)
        }

        /**
         * 返回一个使用指定的 KOption.CacheKeyUpdater 更新磁盘缓存键的新 Option。
         */
        fun <T> disk(key:String,cacheKeyUpdater: CacheKeyUpdater<T>):KOption<T> {
            return KOption(key, cacheKeyUpdater = cacheKeyUpdater)
        }

        fun <T> disk(key:String,defaultValue:T,cacheKeyUpdater: CacheKeyUpdater<T>):KOption<T> {
            return KOption(key, defaultValue, cacheKeyUpdater)
        }

    }

    interface CacheKeyUpdater<T> {

        fun update(keyBytes: ByteArray, value: T, messageDigest: MessageDigest)
    }
}